﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//// 前置声明，否则A的友元函数声明编译器不认识B
//class B;
//
//class A
//{
//	// 友元声明
//	friend void func(const A & aa, const B & bb);
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//
//class B
//{
//	// 友元声明
//	friend void func(const A& aa, const B& bb);
//private:
//	int _b1 = 3;
//	int _b2 = 4;
//};
//
//void func(const A& aa, const B& bb)
//{
//	cout << aa._a1 << endl;
//	cout << bb._b1 << endl;
//}
//
//int main()
//{
//	A aa;
//	B bb;
//	func(aa, bb);
//
//	return 0;
//}

//class B;
//
//class A
//{
//	// 友元声明 
//	friend class B;
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//class B
//{
//public:
//	void func1(const A& aa)
//	{
//		cout << aa._a1 << endl;
//		cout << _b1 << endl;
//	}
//	void func2(const A& aa)
//	{
//		cout << aa._a2 << endl;
//		cout << _b2 << endl;
//	}
//private:
//	int _b1 = 3;
//	int _b2 = 4;
//};
//
//int main()
//{
//	A aa;
//	B bb;
//	bb.func1(aa);
//
//	return 0;
//}

//// xxx.h
//class A
//{
//	// 友元声明
//	friend class B;
//public:
//	//声明
//	void func1(const B& dd);
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//
//class B
//{
//	friend class A;
//public:
//	void func1(const A& aa);
//	void func2(const A& aa);
//private:
//	int _b1 = 3;
//	int _b2 = 4;
//};
//
//// xxx.cpp
////定义
//void A::func1(const B& dd)
//{
//	cout << dd._b1 << endl;
//}
//
//void B::func1(const A& aa)
//{
//	cout << aa._a1 << endl;
//	cout << _b1 << endl;
//}
//
//void B::func2(const A& aa)
//{
//	cout << aa._a2 << endl;
//	cout << _b2 << endl;
//}
//
//int main()
//{
//	A aa;
//	B bb;
//	bb.func1(aa);
//	bb.func2(aa);
//
//	return 0;
//}

//class A
//{
//public:
//	//内部类
//	class B
//	{
//	public:
//	private:
//		int _b1;
//	};
//private:
//	static int _k;
//	int _h = 1;
//};
//int main()
//{
//	cout << sizeof(A) << endl;
//	A::B bb;
//	return 0;
//}

//class A
//{
//public:
//	//内部类
//	class B //B默认是A的友元
//	{
//	public:
//		void foo(const A& a)
//		{
//			cout << _k << endl;
//			cout << a._h << endl;
//		}
//	private:
//		int _b1;
//	};
//private:
//	static int _k;
//	int _h = 1;
//};
//int main()
//{
//	cout << sizeof(A) << endl;
//	A::B bb;
//	return 0;
//}

//class Solution {
//    class Sum
//    {
//    public:
//        Sum()
//        {
//            _ret += _i;
//            ++_i;
//        }
//    };
//public:
//    int Sum_Solution(int n) {
//        Sum* ptr = new Sum[n];
//        delete[] ptr;
//        return _ret;
//    }
//    void Clear()
//    {
//        _i = 1;
//        _ret = 0;
//    }
//    ~Solution()
//    {
//        cout << "~Solution()" << endl;
//    }
//
//private:
//    static int _i;
//    static int _ret;
//};
//
//int Solution::_i = 1;
//int Solution::_ret = 0;
//
//void Func(const Solution& s = Solution(), int i = 1)//const会延长匿名对象的生命周期
//{
//
//}
//int main()
//{
//    Solution s; // 有名对象，生命周期在整个域
//    cout << s.Sum_Solution(10) << endl;
//
//    Solution(); // 匿名对象，生命周期只在这一行
//    cout << Solution().Sum_Solution(10) << endl;
//    
//    Func(Solution());
//    Func(s);
//    Func();
//
//    return 0;
//}
//

//class A
//{
//public:
//	A(int a = 0)
//		:_a1(a)
//	{
//		cout << "A(int a)" << endl;
//	}
//	A(const A& aa)
//		:_a1(aa._a1)
//	{
//		cout << "A(const A& aa)" << endl;
//	}
//	~A()
//	{
//		cout << "~A()" << endl;
//	}
//private:
//	int _a1 = 1;
//};
//void f1(A aa)
//{
//}

//int main()
//{
//	// 构造+拷⻉构造 优化 -> 构造
//	A aa1 = 1;
//	cout << "==================" << endl;
//	// 传值传参 
//	f1(aa1);
//	cout << "==================" << endl;
//	
//	f1(1);
//	cout << "==================" << endl;
//	
//	f1(A(1));
//	cout << "==================" << endl;
//	return 0;
//}
//class A
//{
//public:
//	A(int a = 0)
//		:_a1(a)
//	{
//		cout << "A(int a)" << endl;
//	}
//	A(const A& aa)
//		:_a1(aa._a1)
//	{
//		cout << "A(const A& aa)" << endl;
//	}
//	~A()
//	{
//		cout << "~A()" << endl;
//	}
//private:
//	int _a1 = 1;
//};
//void f1(A aa)
//{
//}
//
//A f2()
//{
//	A aa;
//	return aa;
//}
//
//int main()
//{
//	A aa1 = f2();
//	return 0;
//}

//class A
//{
//public:
//	A(int a = 0)
//		:_a1(a)
//	{
//		cout << "A(int a)" << endl;
//	}
//	A(const A& aa)
//		:_a1(aa._a1)
//	{
//		cout << "A(const A& aa)" << endl;
//	}
//	A& operator=(const A& aa)
//	{
//		cout << "A& operator=(const A& aa)" << endl;
//		if (this != &aa)
//		{
//			_a1 = aa._a1;
//		}
//		return *this;
//	}
//	~A()
//	{
//		cout << "~A()" << endl;
//	}
//private:
//	int _a1 = 1;
//};
//A f1()
//{
//	//URVO
//	return A(1);
//}
//A f2()
//{
//	//NRVO
//	A aa;
//	cout << &aa << endl;
//	return aa;
//}
//int main()
//{
//	A aa1 = f1();
//	cout << &aa1 << endl;
//	cout << "=========" << endl;
//	A aa2 = f2();
//	cout << &aa2 << endl;
//	return 0;
//}
class A
{
public:
	A(int a = 0)
		:_a1(a)
	{
		cout << "A(int a)" << endl;
	}
	A(const A& aa)
		:_a1(aa._a1)
	{
		cout << "A(const A& aa)" << endl;
	}
	A& operator=(const A& aa)
	{
		cout << "A& operator=(const A& aa)" << endl;
		if (this != &aa)
		{
			_a1 = aa._a1;
		}
		return *this;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a1 = 1;
};
A f2()
{
	// NRVO
	A aa;
	cout << &aa << endl;
	return aa;

	// URVO
	// return A(1);
}

int main()
{
	// 不推荐
	A aa1;
	aa1 = f2();
	cout << &aa1 << endl;

	// 推荐
	A aa2 = f2();

	return 0;
}